home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / hce.lha / HCE / LibSource / clib / Stdio / src / fread.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-02  |  1.1 KB  |  57 lines

  1. #include <clib/stdio.h>
  2.  
  3. /* December 93. */
  4. /* Modifications and Bug fixes by Jason Petty. Marked with VANSOFT. */
  5.  
  6. int fread(buf, size, number, fi)
  7. char  *buf;
  8. int   size;
  9. int   number;
  10. register FILE *fi;
  11. {
  12.     long r, rr, m, n;
  13.         unsigned long bytesread = 0L; /* Added VANSOFT. */
  14.  
  15.     r = (fi->_flag &= ~_IORW);
  16.  
  17.     if(!(r & _IOREAD) || (r & (_IOERR | _IOEOF)))
  18.         return(EOF);
  19.     if(fi->_base == NULL)    /* allocate a buffer if there wasn't one */
  20.         _getbuf(fi);
  21.  
  22.     rr = 0;
  23.     n = size * number;
  24.  
  25.     for (;;) {
  26.                   bytesread += fi->_cnt;  /* Added VANSOFT. */
  27.                   r = fi->_cnt;
  28.         if (r > n)
  29.                     r = n;
  30.         if (r) {
  31.             (void)lmemcpy( buf, fi->_ptr, r );
  32.                      if(bytesread < n)  /* Added VANSOFT. */
  33.                     buf += r;
  34.                         fi->_ptr += r;  /* Added VANSOFT. required else bug!*/
  35.             n -= r;
  36.             rr += r;
  37.             fi->_cnt -= r;
  38.         }
  39.  
  40.         if (n) {
  41.             m = read(fi->_file, fi->_base, fi->_bsiz);
  42.             if(m <= 0){
  43.                 fi->_flag |= ((m == 0) ? _IOEOF : _IOERR);
  44.                 if ( m < 0 )
  45.                     return EOF;
  46.             }
  47.  
  48.             fi->_cnt = m;
  49.             fi->_ptr = fi->_base;
  50.             if ( m > 0 )
  51.                 continue;
  52.         }
  53.         break;
  54.     }
  55.     return (rr / size );
  56. }
  57.